#pragma once
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdarg.h>
#include<unistd.h>
#include<ctime>
#include<mutex>
#include<sys/time.h>

#define SIZE 1024

// 日志级别定义
#define Info 0
#define Debug 1
#define Warning 2
#define Error 3 
#define Fatal 4

// 输出方式定义
#define Screen 1
#define Onefile 2
#define Classfile 3

// 日志文件名定义
#define LogFile "log.txt"

class Log{
public:
    Log();
    ~Log();

    // 设置日志输出方式
    void Enable(int method);

    // 设置日志级别阈值
    void SetLevel(int level);

    // 设置日志文件路径
    void SetPath(const std::string& logPath);

    // 将日志级别转换为字符串
    std::string levelToString(int level);

    // 获取当前时间戳字符串
    std::string getCurrentTime();

    // 重载函数调用操作符，支持格式化日志输出
    void operator()(int level, const char* format, ...);

    // 提供不同级别的便捷方法
    void info(const char* format, ...);
    void debug(const char* format, ...);
    void warning(const char* format, ...);
    void error(const char* format, ...);
    void fatal(const char* format, ...);

private:
    // 格式化并输出日志
    void printLog(int level, const std::string &logtxt);

    // 写入单个日志文件
    void printOneFile(const std::string &logname, const std::string &logtxt);

    // 按日志级别分类写入不同文件
    void printClassFile(int level, const std::string &logtxt);

    // 内部日志记录方法
    void log(int level, const char* format, va_list args);

private:
    int printMethod;        // 输出方式
    int minLevel;           // 最小日志级别
    std::string path;       // 日志文件路径
    std::mutex mutex_;      // 线程安全互斥锁
};  

// 全局日志实例
extern Log lg;